home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 130_01 / makesys.c < prev    next >
Text File  |  1985-03-09  |  4KB  |  136 lines

  1.  
  2.  
  3.  
  4.  
  5. #include "bdscio.h"
  6. #include "makedef.h"
  7. #define MINCPM 0x1680
  8.  
  9.  
  10.  
  11.  
  12. main( argc, argv )
  13. int argc ;
  14. char **argv ;
  15. {
  16.     char boot[16], cpmfile[16], bios[16] ;
  17.     unsigned parm[MAXVECTOR] ;
  18.     char test, *p, n ;
  19.     char *biosadress();
  20.     unsigned cpmbytes, bootbytes, biosbytes, cpmsize ;
  21.     unsigned bootsiz ;
  22.     char *area, *sbrk(), linebuf[256] ;
  23.  
  24.     putchar('\n');
  25.     printf("      + + +  CP/M 2.2 System Generator  + + + \n");
  26.     printf("             (c) 1981  Occam Mjukvaror\n");
  27.     area = sbrk( MINCPM );
  28.     if(area == ERROR){
  29.         printf("Sorry, but you've got too little memory space.\n");
  30.         exit();
  31.         }
  32.  
  33.     cat( argc, argv, linebuf );
  34.     if(parm[TEST] == TRUE)
  35.     puts( linebuf );puts("\n");
  36.     cpmsize = 0x1600 ;
  37.     argument( linebuf, boot, cpmfile, bios, parm );
  38.     if(parm[TEST] == TRUE){
  39.     printf("Cpmbase in core = %4xH\n",area);
  40.     if(parm[ISBOOT] == TRUE)
  41.         printf("Bootfile = %s \n",boot);
  42.     printf("Cpmfile = %s \n",cpmfile );
  43.     printf("Biosfile = %s \n", bios );
  44.     for( argc=0;argc < MAXVECTOR;argc++)
  45.         printf("parm %u = %u \n",argc,parm[argc]);
  46.     }
  47.     rcpm( cpmfile, area );
  48.     if(parm[ISBOOT] == TRUE)bootsiz = rhex( boot, area, 128, 0,0);
  49.     if(parm[TEST] == TRUE)printf("Biosbase in core = %4xH\n",area + 0x1680);
  50.     if(parm[NOCHECK] == TRUE)biosbytes = rhex( bios, area + 0x1680, 9999, 0,0);
  51.     else biosbytes = rhex( bios, area + 0x1680, 9999, biosadress( area ),0);
  52.     cpmsize += biosbytes ;
  53.     if(parm[TEST] == TRUE)printf("Biosadress = %4x \n",biosadress(area));
  54.     if(parm[TEST] == TRUE)printf("Bios was %u bytes.\n",biosbytes);
  55.     if(parm[PATCH] == TRUE){
  56.         p = (parm[PATCHADRESS] - 0x900) + area ;
  57.         if(parm[TEST] == TRUE)printf("Patch adress in core = %4xH\n",p);
  58.         for(n = 0; parm[PATCHBYTE + n] != ERROR ; n++){
  59.             if(parm[PATCHBYTE] == ERROR)break ;
  60.             *p++ = parm[PATCHBYTE + n ];
  61.             }
  62.         }
  63.     if(parm[AUTOPATCH] == TRUE){
  64.         p = (0x18de - 0x900) + area ;
  65.         *p++ = 0xc3 ;
  66.         bootbytes = biosadress(area);
  67.         *p++ = ((bootbytes + 0x33) & 0x00ff );
  68.         *p++ = ((bootbytes + 0x33) >> 8 ) &0x00ff ;
  69.         }
  70.     bootbytes = cpmsize / 128 + 1 ;
  71.     if(parm[TEST] == TRUE)printf("Sectors to write = %u\n",bootbytes);
  72.     if(parm[IMMEDIATE] == TRUE)sysgen(parm[DRIVE],area);
  73.     else wcpm( cpmfile, area, bootbytes );
  74.     p = biosadress( area );
  75.     bootbytes = p ;
  76.     printf("  CCP  adress = %4xH       CCP  size = %u bytes.\n",p - 0x1600,
  77.             0x800 );
  78.     printf("  BDOS adress = %4xH       BDOS size = %u bytes.\n",(p - 0x1600) + 0x800,
  79.             (0x1600 - 0x800));
  80.     printf("  BIOS adress = %4xH       BIOS size = %u bytes.\n",p,biosbytes);
  81.     printf("  CP/M system = %u kbyte    CP/M size = %u bytes.\n",(bootbytes + 0x600)/1024,
  82.              cpmsize );
  83.     if(parm[ISBOOT] == TRUE)
  84.     printf("  BOOT hex file was %s, it contained %u bytes.\n",boot,bootsiz);
  85.     printf("  BIOS hex file was %s.\n",bios);
  86.     printf("  CP/M system read from %s.\n",cpmfile);
  87.     if(parm[PATCH] == TRUE){
  88.         printf("  Patch installed at adress %4xH, bytes: ",parm[PATCHADRESS]);;
  89.         for(n=0;n<MAXPATCH;n++){
  90.             if(parm[PATCHBYTE + n] == ERROR)break;
  91.             printf("%2xH ",parm[PATCHBYTE + n]);
  92.             }
  93.         printf("\n");
  94.         }
  95.     if(parm[AUTOPATCH] == TRUE)
  96.     printf("  Auto patch installed as preprogrammed.\n");
  97.     if(parm[IMMEDIATE] == TRUE)
  98.         printf("  Immediate sysgen on drive %c.\n",parm[DRIVE] + 'A');
  99.     else printf("  The number of 128 byte sectors written to file %s was : %3u\n",
  100.         cpmfile,cpmsize / 128 + 17 );
  101.  
  102.     parm[BOOTADRESS] = 0xf427 ;
  103.     if(parm[DIRECTBOOT] == TRUE)call(parm[BOOTADRESS],0,0,0,0);
  104. }
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111. cat( argc, argv, linebuf )
  112. int argc ;
  113. char **argv, *linebuf ;
  114. {
  115.     char n ;
  116.  
  117.     *linebuf = 0 ;
  118.     for(n = 1 ; n < argc ; n++ ){
  119.         strcat( linebuf, argv[n] );
  120.         strcat( linebuf, "     " );
  121.         }
  122. }
  123.  
  124.  
  125. char *biosadress( base )
  126. char *base ;
  127. {
  128.     char *o, c ;
  129.  
  130.     o = base + 0x82 ;
  131.     c = *o ;
  132.     return((c << 8) + 0x1300);
  133. }
  134.  
  135.  
  136.